import { createApp } from 'vue';
// 不知道为啥这个一定要先第一顺序引入，放在router后面应用会打不开，可能是大量循环依赖的问题
// eslint-disable-next-line
import {
  pinia, useUsersStore, useConfigStore, useGameStore,
} from './store';

// 全局样式
import './styles.css';
// 不同像素分辨率的适配 使用 rem 单位

import '@/assets/iconfont/iconfont';
// element-plus 只使用api的地方，需要手动导入css 参考此处
// https://element-plus.org/zh-CN/guide/quickstart.html#手动导入
import 'element-plus/es/components/message/style/css';

import SvgIcon from '@/components/svg/svg-icon.vue';
import PageLayout from '@/components/layout/page.vue';
import { odinCore } from '@/core-sdk';
import { statistic51la } from '@/contrib/51.la';
import { invoke } from '@tauri-apps/api';
import { $api, initApi } from '@/api';
import App from './layout/app.vue';
import { onWindowErrorHandler, unHandledRejectionHandler, vueErrorHandler } from './exception/error-handle';
import { initRemAdapter } from './contrib/rem';
import router from './router';
import { refreshUserDetailInfo } from './contrib/api-common';
import globalDirectivesPlugin from './contrib/directives';

async function main() {
  // 这个事件如果放在 await 之后，将无法被触发
  document.addEventListener('DOMContentLoaded', () => {
    invoke('show_app');
  });
  // rem 适配方案
  initRemAdapter();
  await initApi();
  const app = createApp(App);

  // 或者是自行处理错误
  app.config.errorHandler = vueErrorHandler;
  // 处理全局Promise未捕获异常
  window.addEventListener('unhandledrejection', unHandledRejectionHandler);
  window.addEventListener('error', onWindowErrorHandler);

  // 在组件里直接 this.$api 也可以使用
  app.use($api);
  // 统计系统
  app.use(statistic51la);

  // 全局指令
  app.use(globalDirectivesPlugin);

  app.component('svg-icon', SvgIcon);
  app.component('page-layout', PageLayout);
  // 后续的 Core与router都需要使用 pinia，所以要最先安装 pinia/vuex
  app.use(pinia);

  app.use(odinCore);
  app.use(router);

  // 需要读入完成后 才能继续 这里实际上暂时是同步的
  // 但未来可能会是异步的过程
  const userStore = useUsersStore();
  await userStore.loadFromStorage(); // 从本地读取用户id、手机号
  if (userStore.isAuthorized) {
    refreshUserDetailInfo(); // 从网络读取刷新 没有加 await 异步进行即可
  }
  userStore.lodePersonalDetailsFn(); // 从本地读取个人详细信息

  const gameStore = useGameStore();
  gameStore.lodeClientConfigFn(); // 从本地读取客户端配置数据
  gameStore.loadLocalFavorites(); // 从本地读取收藏的游戏数据（先获取用户id,在获取收藏游戏数据）
  gameStore.lodeadvertisingImage(); // 从本地读取广告图数据
  gameStore.lodeAllLabels(); // 从本地读取所有游戏 - 标签列表
  gameStore.loadGamePathConfig();
  // 加载系统配置 这里可以异步 不要求同步加载
  const configStore = useConfigStore();
  configStore.loadConfig();

  app.mount('#app');
}

main();
